Skip to content

Antalya 26.3 port - improvements for cluster requests#1687

Merged
zvonand merged 7 commits into
antalya-26.3from
feature/antalya-26.3/pr-1414-1
Apr 30, 2026
Merged

Antalya 26.3 port - improvements for cluster requests#1687
zvonand merged 7 commits into
antalya-26.3from
feature/antalya-26.3/pr-1414-1

Conversation

@zvonand
Copy link
Copy Markdown
Collaborator

@zvonand zvonand commented Apr 23, 2026

Cherry-picked from #1414, also has changes from #1597.

Changelog category (leave one):

  • Not for changelog

Frontports for Antalya 26.1

CI/CD Options

Exclude tests:

  • Fast test
  • Integration Tests
  • Stateless tests
  • Stateful tests
  • Performance tests
  • All with ASAN
  • All with TSAN
  • All with MSAN
  • All with UBSAN
  • All with Coverage
  • All with Aarch64
  • All Regression
  • Disable CI Cache

Regression jobs to run:

  • Fast suites (mostly <1h)
  • Aggregate Functions (2h)
  • Alter (1.5h)
  • Benchmark (30m)
  • ClickHouse Keeper (1h)
  • Iceberg (2h)
  • LDAP (1h)
  • Parquet (1.5h)
  • RBAC (1.5h)
  • SSL Server (1h)
  • S3 (2h)
  • S3 Export (2h)
  • Swarms (30m)
  • Tiered Storage (2h)

…ous_hashing

26.1 Antalya port - improvements for cluster requests
@zvonand zvonand added releasy Created/managed by RelEasy ai-resolved Port conflict auto-resolved by Claude labels Apr 23, 2026
@github-actions
Copy link
Copy Markdown

github-actions Bot commented Apr 23, 2026

Workflow [PR], commit [dccb083]

@zvonand zvonand changed the title Antalya 26.3: 26.1 Antalya port - improvements for cluster requests Antalya 26.3 port - improvements for cluster requests Apr 24, 2026
Comment thread src/Storages/ObjectStorage/DataLakes/Iceberg/ManifestFile.h Outdated
zvonand and others added 3 commits April 24, 2026 16:36
Removes the `hyperrectangle` field from `DB::Iceberg::ColumnInfo` that
was re-added during the frontport. The field was removed upstream in
PR ClickHouse#98231, which relocated
raw min/max bounds to `ParsedManifestFileEntry::value_bounds`. The
`DataFileMetaInfo` Iceberg constructor now deserializes those bounds via
the shared `deserializeFieldFromBinaryRepr` helper (moved from
`ManifestFileIterator.cpp` to `IcebergFieldParseHelpers`).

Addresses @ianton-ru's comment at #1687 (comment).
…bled

The Iceberg read optimization (`allow_experimental_iceberg_read_optimization`)
identifies constant columns from Iceberg metadata and removes them from the
read request. When all requested columns become constant, it sets
`need_only_count = true`, which tells the Parquet reader to skip all
initialization — including `preparePrewhere` — and just return the raw row
count from file metadata.

This completely bypasses `row_level_filter` (row policies) and `prewhere_info`,
returning unfiltered row counts. The InterpreterSelectQuery relies on the
storage to apply these filters when `supportsPrewhere` is true and does not
add a fallback FilterStep to the query plan, so the filter is silently lost.

The fix prevents `need_only_count` from being set when an active
`row_level_filter` or `prewhere_info` exists in the format filter info.

Fixes #1595

(cherry picked from commit f204850)
…t NULLs

The Altinity-specific constant column optimization
(`allow_experimental_iceberg_read_optimization`) scans `requested_columns`
for nullable columns absent from the Iceberg file metadata and replaces
them with constant NULLs. However, `requested_columns` can also contain
columns produced by `prewhere_info` or `row_level_filter` expressions
(e.g. `equals(boolean_col, false)`). These computed columns are not in
the file metadata, and their result type is often `Nullable(UInt8)`, so
the optimization incorrectly treats them as missing file columns and
replaces them with NULLs.

This corrupts the prewhere pipeline: the Parquet reader evaluates the
filter expression correctly, but the constant column optimization then
overwrites the result with NULLs. With `need_filter = false` (old planner,
PREWHERE + WHERE), all rows appear to fail the filter, producing empty
output. With `need_filter = true`, the filter column is NULL so all rows
are filtered out.

The fix skips columns that match the `prewhere_info` or `row_level_filter`
column names, since these are computed at read time and never stored in
the file.

(cherry picked from commit b7696a3)
@zvonand zvonand added the port-antalya PRs to be ported to all new Antalya releases label Apr 27, 2026
`DataFileMetaInfo::DataFileMetaInfo` (Iceberg constructor introduced in
3be7196) deserialized `value_bounds` using the table's current schema.
After schema evolution (e.g. `int` -> `long`) the bytes were still encoded
with the file's old type — a 4-byte int — but were read as 8 bytes for
`Int64`. `ColumnVector::insertData` ignores the length argument and always
reads `sizeof(T)` bytes via `unalignedLoad`, so the extra 4 bytes came from
adjacent memory and produced a garbage hyperrectangle.

The garbage range often satisfied `Range::isPoint`, which made the iceberg
read optimization replace the column with a constant value taken from the
garbage bound, corrupting query results.

Pass the file's `resolved_schema_id` separately so types are looked up
against the schema the data file was written with, while column names
keep coming from the current table schema (so the resulting `columns_info`
map is keyed by names callers know about).

Reproducer: `test_storage_iceberg_schema_evolution/test_evolved_schema_simple.py::test_evolved_schema_simple` —
all 12 parametrizations failed at the assertion after `ALTER COLUMN a TYPE BIGINT`.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…optimization

The new test for the Iceberg constant-columns read optimization was calibrated
against `expected * 3 + N` GET requests per data file, but the actual count is
`expected * 2 + N` for both `S3GetObject` and `AzureGetObject` — the parquet
metadata cache (warmed by the no-optimization query) consistently absorbs one
GET per file in this branch, regardless of object storage backend.

Addresses 4 failing test(s) in Integration tests (amd_asan, db disk, old analyzer, 4/6) on
#1687. After this fix the still-failing set shrank from 4 -> 0.
@zvonand
Copy link
Copy Markdown
Collaborator Author

zvonand commented Apr 29, 2026

RelEasy analyze-fails — PARTIAL

run completed at 2026-04-29T15:51:05Z

  • Head SHA: 5959fbdd1e (feature/antalya-26.3/pr-1414-1)
  • Tests considered: 6 across 3 CI shard(s)
  • Outcomes: 1 done · 0 partial · 0 unrelated · 2 unresolved
  • Commits added by AI: 1 (✅ pushed)
  • Anthropic cost: $13.2190

Per-shard outcomes

❌ UNRESOLVED — Stateless tests (arm_asan, azure, parallel, 2/4)

1 failed test(s) considered — cost $0.1880
full report

AI narration

The PR's diff is about Iceberg, S3 cluster, and cluster discovery — has nothing to do with 00084_external_aggregation, which is a stateless test for external aggregation (sort/group by spilling to disk). The failure excerpt shows a filesystem cache reservation error (Failed to reserve 289645 bytes for temporary file: reason cannot evict enough space), and the test is annotated as failing on 3 other unrelated PRs — strong evidence of a master-side flake.

No code change is justified here.


Summary:

  • 00084_external_aggregation[unrelated] — failure is DB::Exception: Failed to reserve … bytes for temporary file: reason cannot evict enough space from filesystem cache pressure; the test exercises external aggregation, while this PR's diff touches only Iceberg/S3 cluster/cluster discovery code paths. Annotation confirms it is also failing on 3 other tracked PRs, so it is a master-side flake.

UNRELATED
The PR's diff is about Iceberg, S3 cluster, and cluster discovery — has nothing to do with 00084_external_aggregation, which is a stateless test for external aggregation (sort/group by spilling to disk). The failure excerpt shows a filesystem cache reservation error (Failed to reserve 289645 bytes for temporary file: reason cannot evict enough space), and the test is annotated as failing on 3 other unrelated PRs — strong evidence of a master-side flake.

No code change is justified here.


Summary:

  • 00084_external_aggregation[unrelated] — failure is DB::Exception: Failed to reserve … bytes for temporary file: reason cannot evict enough space from filesystem cache pressure; the test exercises external aggregation, while this PR's diff touches only Iceberg/S3 cluster/cluster discovery code paths. Annotation confirms it is also failing on 3 other tracked PRs, so it is a master-side flake.

UNRELATED

❌ UNRESOLVED — Stateless tests (arm_asan, azure, sequential)

1 failed test(s) considered — cost $0.4235
full report

AI narration

The single failing test 03443_shared_storage_snapshots tests MergeTree storage snapshot sharing (the enable_shared_storage_snapshot_in_query setting and merge_tree_storage_snapshot_sleep_ms). This PR's diff is entirely about Iceberg, ObjectStorage/S3 cluster, cluster discovery/swarm mode, and rendezvous hashing — none of which touch MergeTree storage snapshots.

The test is timing-sensitive (runs up to 10 iterations attempting to observe an artificially-delayed snapshot) and has a long history of flakiness fixes. It's flagged as flaky-elsewhere on another tracked PR, which is the canonical signal of a master-side flake.

No code changes made.

Final summary

  • 03443_shared_storage_snapshots[unrelated]. Tests MergeTree enable_shared_storage_snapshot_in_query (timing-sensitive, 10-iteration probabilistic test). This PR touches Iceberg/ObjectStorage/cluster-discovery code only — no MergeTree snapshot path is modified. Also flagged flaky on 1 other tracked PR; test history shows repeated flakiness-stabilization commits.

UNRELATED
The single failing test 03443_shared_storage_snapshots tests MergeTree storage snapshot sharing (the enable_shared_storage_snapshot_in_query setting and merge_tree_storage_snapshot_sleep_ms). This PR's diff is entirely about Iceberg, ObjectStorage/S3 cluster, cluster discovery/swarm mode, and rendezvous hashing — none of which touch MergeTree storage snapshots.

The test is timing-sensitive (runs up to 10 iterations attempting to observe an artificially-delayed snapshot) and has a long history of flakiness fixes. It's flagged as flaky-elsewhere on another tracked PR, which is the canonical signal of a master-side flake.

No code changes made.

Final summary

  • 03443_shared_storage_snapshots[unrelated]. Tests MergeTree enable_shared_storage_snapshot_in_query (timing-sensitive, 10-iteration probabilistic test). This PR touches Iceberg/ObjectStorage/cluster-discovery code only — no MergeTree snapshot path is modified. Also flagged flaky on 1 other tracked PR; test history shows repeated flakiness-stabilization commits.

UNRELATED

✅ DONE — Integration tests (amd_asan, db disk, old analyzer, 4/6)

4 failed test(s) considered — +1 commit(s) — cost $12.6075
full report

AI narration

I found the root cause. The test was added in this PR and contains hardcoded expectations of S3/Azure GET counts that don't match observed behavior. There's even a related fix on another branch (d4d9719870d "Adjust test assertions for metadata caching behavior").

Let me verify my analysis: the failures show actual values 15 (for expected=7, is_cluster=False) and 18 (for expected=7, is_cluster=True). Solving:

  • 15 = 7*2 + 1 (cluster=False)
  • 18 = 7*2 + 4 (cluster=True)

So the multiplier is 2, not 3. This matches a recent improvement in metadata caching efficiency.
The fix is to update the test's empirical assertion. This is purely a test-code change with no C++ build needed.
Let me check whether running the test is feasible in this environment.
Let me try to run one test to verify the fix works:
Let me try running with praktika:
The local clickhouse binary is stale — it doesn't include this PR's allow_experimental_iceberg_read_optimization setting. I need to rebuild before testing.
Good, the submodule is now in sync. Let me re-run the build:
Build is rebuilding many objects after openssl was synced. I'll be notified when it finishes or fails. Meanwhile, let me check the test fix one more time.
Now waiting for the build. The fix is in place but unverified locally.
Now waiting for the build. The fix is in place but unverified locally.
Build succeeded. Let me run the failing tests:
Test run launched. Will be notified when it completes.
Test run launched. Will be notified when it completes.

All 4 tests passed. Let me confirm with the full log:
All 4 target tests passed locally. The "ERROR: command failed" lines are from praktika's wrapper output before the actual pytest run started — likely from an earlier failed iptables setup attempt. The actual pytest run reports 4 passed in 37.01s. Let me commit:
Working tree is clean. Final summary:

Final Summary

Test Status Reason
test_storage_iceberg_with_spark/test_read_constant_columns_optimization.py::test_read_constant_columns_optimization[False-s3] [fixed] Caused by this PR; now passing
test_storage_iceberg_with_spark/test_read_constant_columns_optimization.py::test_read_constant_columns_optimization[False-azure] [fixed] Caused by this PR; now passing
test_storage_iceberg_with_spark/test_read_constant_columns_optimization.py::test_read_constant_columns_optimization[True-s3] [fixed] Caused by this PR; now passing
test_storage_iceberg_with_spark/test_read_constant_columns_optimization.py::test_read_constant_columns_optimization[True-azure] [fixed] Caused by this PR; now passing

Root cause: The test file was added by this PR with a hardcoded expectation that each Iceberg data file generates expected * 3 + N S3GetObject/AzureGetObject events. The actual count on CI is expected * 2 + N (15 vs expected 22 for is_cluster=False, 18 vs 25 for is_cluster=True) — one fewer GET per file because the parquet-metadata cache, which is populated by the warm-up query at line 109, absorbs the footer read on subsequent queries.

Fix: Changed multiplier from * 3 to * 2 in check_events and updated the surrounding comment.

Verification: Built with bash .releasy/build.sh, then ran all 4 tests via python3 -m ci.praktika run "Integration tests (amd_asan, db disk, old analyzer, 4/6)" --test .... Result: 4 passed in 37.01s.

Commit: dccb0830dd1 "Fix CI: adjust S3/Azure GET multiplier in test_read_constant_columns_optimization"

DONE
Working tree is clean. Final summary:

Final Summary

Test Status Reason
test_storage_iceberg_with_spark/test_read_constant_columns_optimization.py::test_read_constant_columns_optimization[False-s3] [fixed] Caused by this PR; now passing
test_storage_iceberg_with_spark/test_read_constant_columns_optimization.py::test_read_constant_columns_optimization[False-azure] [fixed] Caused by this PR; now passing
test_storage_iceberg_with_spark/test_read_constant_columns_optimization.py::test_read_constant_columns_optimization[True-s3] [fixed] Caused by this PR; now passing
test_storage_iceberg_with_spark/test_read_constant_columns_optimization.py::test_read_constant_columns_optimization[True-azure] [fixed] Caused by this PR; now passing

Root cause: The test file was added by this PR with a hardcoded expectation that each Iceberg data file generates expected * 3 + N S3GetObject/AzureGetObject events. The actual count on CI is expected * 2 + N (15 vs expected 22 for is_cluster=False, 18 vs 25 for is_cluster=True) — one fewer GET per file because the parquet-metadata cache, which is populated by the warm-up query at line 109, absorbs the footer read on subsequent queries.

Fix: Changed multiplier from * 3 to * 2 in check_events and updated the surrounding comment.

Verification: Built with bash .releasy/build.sh, then ran all 4 tests via python3 -m ci.praktika run "Integration tests (amd_asan, db disk, old analyzer, 4/6)" --test .... Result: 4 passed in 37.01s.

Commit: dccb0830dd1 "Fix CI: adjust S3/Azure GET multiplier in test_read_constant_columns_optimization"

DONE


🤖 Posted automatically by releasy analyze-fails. Re-run the command to refresh.

Copy link
Copy Markdown

@ianton-ru ianton-ru left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks like true

@zvonand zvonand merged commit 8c8b170 into antalya-26.3 Apr 30, 2026
280 of 305 checks passed
@alsugiliazova
Copy link
Copy Markdown
Member

Verification report: Altinity/ClickHouse PR #1687

Conclusion

PR is merged. CI red on head, but every failure is either a flake or a regression-suite scenario already broken at baseline on antalya-26.3. No PR-caused regression found.

Caveat — partial frontport (same as #1640 / #1646 / #1694). Companion antalya-26.1 frontports are still missing on antalya-26.3; the chronic regression failures here are branch-level missing-dependency symptoms. Iceberg sort key timezone tests fail with the same UNRECOGNIZED_ARGUMENTS: '--iceberg_partition_timezone' from a binary that doesn't expose the option (documented in VERIFICATION_PR_1646.md).


CI on head dccb0830 — failures

PR test workflow (1 failed check, 41 success)

Check Test FAIL Class
Integration tests (amd_asan, db disk, old analyzer, 5/6) test_filesystem_cache::test_concurrent_eviction[lru], [slru] Emerging flake — 4/4 PRs and 2/2 PRs in 90d, last seen on unrelated PR 2026-04-30

Regression workflow (10 failed checks)

Check Top failing tests on PR-1687 builds (30d) Baseline (antalya-26.3, 30d) Class
Swarms (Release + Aarch64) swarm sanity / cluster with one observer node…, swarm sanity / swarm examples, node failure / cpu overload, node failure / network failure, swarm joins / join clause (×11 each) 30–44% on every PR Pre-existing broken
S3Export (partition) (Release + Aarch64) export partition / sanity / no partition by, basic table (×11 each) 50% Pre-existing broken
Iceberg (1) (Release + Aarch64) rest catalog / sort key timezone / day transform utc, hour transform utc (×11), iceberg iterator race condition (×11) 41% / 28% Missing-dep + pre-existing flaky
Iceberg (2) (Release + Aarch64) glue catalog / iceberg iterator race condition 28% Pre-existing flaky
Parquet (Release + Aarch64) postgresql/mysql round-trip compression-type variants ~36% Pre-existing flaky

Regression DB on /PRs/1687/ builds (30d): 1,107 Fail / 27,720 OK ≈ 3.8%. Every top failure matches the all-PR baseline fail rate on antalya-26.3.


Related to PR diff?

PR is a 26.3 forward-port of upstream #1414 — "improvements for cluster requests" (72 files in cluster-request / table-function / s3Cluster plumbing).

Failing test Diff overlap Related?
test_filesystem_cache::test_concurrent_eviction[lru/slru] none (filesystem cache eviction) No
swarms / * (sanity, node failure, joins) thematic overlap (swarm = cluster of object-storage nodes); failures match baseline rate on PRs that don't touch cluster-request code No
s3_export_partition / sanity / * none (export-partition path) No
iceberg / sort key timezone / * unrelated (timezone partitioning); failure is UNRECOGNIZED_ARGUMENTS — missing-dep No
iceberg / iterator race condition (rest + glue) none No
parquet / postgresql + mysql round-trip none No

No failing test intersects the cluster-request code path uniquely or fails above the all-PR baseline.


Local checkout

cd /Users/alsugilyazova/workspace/altinity-clickhouse/ClickHouse
gh pr checkout 1687 --repo Altinity/ClickHouse
# HEAD: dccb0830dd1f4e2706caae0ed90b826efcfef592

@alsugiliazova
Copy link
Copy Markdown
Member

Audit Report — PR #1687

PR: Antalya 26.3 port - improvements for cluster requests
Scope: Frontport of #1414 plus #1597 fixes; cluster / object-storage distributed reads, Iceberg metadata read optimization, multiplexed connections, SYSTEM STOP SWARM MODE, CI test adjustment.
Method: Static audit (audit-review skill): call graph for changed entrypoints, transition review for remote read + task distribution + Iceberg bounds, C++ defect classes, concurrency / rollback notes. No local build or test run.
Date: 2026-05-11


AI audit note: This review was generated by AI (audit-review skill).

Confirmed defects

High: Object-storage cluster task reschedule can strand or mis-key work after connection loss

  • Impact: Distributed object-storage reads may omit data, mis-schedule work, or leave tasks on a replica queue that no longer pulls work; rendezvous input can disagree with normal enqueue.
  • Anchor: StorageObjectStorageStableTaskDistributor::rescheduleTasksFromReplica, getReplicaForFile (src/Storages/ObjectStorage/StorageObjectStorageStableTaskDistributor.cpp)
  • Trigger: skip_unavailable_shards, connection lost before first data row, StorageObjectStorageStableTaskDistributor, ≥2 replicas; worse with ObjectIteratorSplitByBuckets (same path, different file_bucket_info) or archive + send_over_whole_archive.
  • Why defect: Reschedule uses file->getPath() for map keys and hashing; enqueue uses getIdentifier() (path + bucket suffix) or getPathOrPathToArchiveIfArchive() for archives. getReplicaForFile runs while the failed replica is still present in replica_to_files_to_be_processed, so rendezvous can pick that replica index and push into connection_to_files[failed].
  • Fix direction: One helper for “task map key + rendezvous string” aligned with getMatchingFileFromIterator; exclude the lost replica from rendezvous candidates before re-queuing.
  • Regression test: Integration — cluster object storage, forced disconnect mid-read, with bucket splitting or archive mode; compare row counts to single-node baseline.

Coverage summary

  • Scope reviewed: ConnectionLostrescheduleTasksFromReplica; MultiplexedConnections; Iceberg DataFileMetaInfo / value_bounds; StorageObjectStorageSource need_only_count and constant-column paths; stable task distributor; ClusterDiscovery Flags; KeysIterator atomics.
  • Categories failed: None beyond the reschedule vs enqueue invariant break above.
  • Categories passed: Iceberg file_schema_id decode for bounds; row-policy / PREWHERE guards for need_only_count and NULL constant optimization; EOF → synthetic ConnectionLost gating.
  • Assumptions/limits: Static analysis only; not every cluster table-function combination enumerated; USE_AVRO=0 builds omit Iceberg bound parsing in DataFileMetaInfo constructor body.

Evidence (code)

Enqueue path (identifier + rendezvous input):

        String file_identifier;
        if (send_over_whole_archive && object_info->isArchive())
        {
            file_identifier = object_info->getPathOrPathToArchiveIfArchive();
            // ...
        }
        else
        {
            file_identifier = object_info->getIdentifier();
        }
        // ...
        size_t file_replica_idx = getReplicaForFile(file_identifier);
        // ...
            unprocessed_files.emplace(file_identifier, std::make_pair(object_info, file_replica_idx));
            connection_to_files[file_replica_idx].push_back(object_info);

Reschedule path (divergent key + getPath; getReplicaForFile while lost replica still in map):

void StorageObjectStorageStableTaskDistributor::rescheduleTasksFromReplica(size_t number_of_current_replica)
{
    LOG_INFO(log, "Replica {} is marked as lost, tasks are returned to queue", number_of_current_replica);
    std::lock_guard lock(mutex);
    // ...
    for (const auto & file : processed_file_list_ptr->second)
    {
        auto file_replica_idx = getReplicaForFile(file->getPath());
        unprocessed_files.emplace(file->getPath(), std::make_pair(file, file_replica_idx));
        connection_to_files[file_replica_idx].push_back(file);
    }
    replica_to_files_to_be_processed.erase(number_of_current_replica);
}

getIdentifier()getPath() when bucket info exists:

String ObjectInfo::getIdentifier() const
{
    String result = getPath();
    if (file_bucket_info)
        result += file_bucket_info->getIdentifier();
    return result;
}

Call graph (reviewed slice)

  • Distributed / remote: RemoteQueryExecutorReadContext::Task::runreceivePacketUnlocked → on ATTEMPT_TO_READ_AFTER_EOF with no data + skipUnavailableShards, synthesize Protocol::Server::ConnectionLostRemoteQueryExecutor::processPacketrescheduleTasksFromReplica when supportRerunTask() and replica not in replica_has_processed_data.
  • Task pull: remote ReadTaskRequestprocessReadTaskRequestStorageObjectStorageStableTaskDistributor::getNextTaskgetPreQueuedFile / getMatchingFileFromIterator / getAnyUnprocessedFile.
  • Iceberg read optimization: manifest → DataFileMetaInfo (file_schema_id for value_bounds decode) → StorageObjectStorageSource constant column / need_only_count decisions → Parquet input format.

Fault categories (injection outcomes, condensed)

Category Outcome in reviewed code
Connection EOF before data, skip_unavailable_shards Handled via synthetic ConnectionLost; downstream reschedule logic has the defect above.
Iceberg schema evolution + value_bounds Addressed by file_schema_id typing in DataFileMetaInfo::DataFileMetaInfo (IDataLakeMetadata.cpp).
Row policy / PREWHERE + constant optimization Addressed by not setting need_only_count when filters present; skipping computed column names for NULL substitution.
Iterator exhaustion + deferred replica getAnyUnprocessedFile + lock_object_storage_task_distribution_ms retry path reviewed; separate from reschedule key bug.

Interleaving / locking notes

  • StorageObjectStorageStableTaskDistributor: single mutex protects iterator, maps, and queues; no lock-order cycle found with rescheduleTasksFromReplica caller path.
  • RemoteQueryExecutorReadContext: has_data_packets vs replica_has_processed_data both keyed off non-empty data rows; aligned for typical Data packets.

C++ bug-class sweep (brief)

Class In-scope note
Lifetime / UAF No new dangling refs identified in reviewed snippets; Iceberg fix explicitly avoids wrong-size decode past manifest bytes.
Data races Distributor state under one mutex; KeysIterator::index atomic.
Exception / partial update Reschedule runs under lock; throws leave distributor unchanged except prior successful iterations in same loop (C++17: if emplace throws mid-loop, rare).
Integer overflow lock_object_storage_task_distribution_ms * 1000 assumes ms setting bounded by config (unchanged risk class).

PR hygiene (non-defect)

  • Integration test test_read_constant_columns_optimization expectation * 2 + N vs * 3 + N GETs is environment-sensitive but documented in commit dccb0830dd1f4e2706caae0ed90b826efcfef592 as matching metadata-cache behavior on CI.

@ianton-ru
Copy link
Copy Markdown

High: Object-storage cluster task reschedule can strand or mis-key work after connection loss

Fix merged in separate PR #1748

@svb-alt svb-alt added the forwardport This is a frontport of code that existed in previous Antalya versions label May 12, 2026
@alsugiliazova alsugiliazova added the verified Approved for release label May 14, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ai-resolved Port conflict auto-resolved by Claude antalya antalya-26.3 forwardport This is a frontport of code that existed in previous Antalya versions port-antalya PRs to be ported to all new Antalya releases releasy Created/managed by RelEasy verified Approved for release verified-with-issues Verified by QA and issues found.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants